#!/usr/bin/env python3
# mypy: disallow-untyped-defs
# pylint: disable=C0103,C0114,C0116
######################################################################
#
# Copyright 2005-2025 by Wilson Snyder. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
#
######################################################################
# DESCRIPTION: Query git to get version number

import argparse
import os
import re
import sys

from datetime import datetime, timezone


def get_rev() -> str:
    if 'VERILATOR_SRC_VERSION' in os.environ:
        # e.g. Ubuntu package build
        return os.environ['VERILATOR_SRC_VERSION']

    data = os.popen('git describe --always').read()

    if 'SOURCE_DATE_EPOCH' in os.environ:
        # e.g. Package builds that don't set VERILATOR_SRC_VERSION
        stamp = datetime.fromtimestamp(int(os.getenv("SOURCE_DATE_EPOCH", "0")), tz=timezone.utc)
    else:
        stamp = datetime.now(timezone.utc)
    result = "vUNKNOWN-built" + stamp.strftime("%Y%m%d")

    m = re.search(r'^(v[0-9].*)', data)
    if m:
        # e.g. in a complate verilator checkout with tags; ignore build time
        result = m.group(1)
        result = re.sub('_', '.', result)
    else:
        # e.g. in a sparse submodule checkout without tags; append hash
        m = re.search(r'^([a-f0-9]+)$', data)
        if m:
            result += "-" + m.group(1)

    data = os.popen('git status').read()
    if (re.search('Changed but not updated', data, flags=re.IGNORECASE)
            or re.search('Changes to be committed', data, flags=re.IGNORECASE)
            or re.search('Changes not staged', data, flags=re.IGNORECASE)):
        result += " (mod)"

    return result


parser = argparse.ArgumentParser()
parser.add_argument('directory')
Args = parser.parse_args()

os.chdir(Args.directory)

rev = get_rev()
print("config_rev using " + rev, file=sys.stderr)
print("static const char* const DTVERSION_rev = \"" + rev + "\";")
